package com.tms.basic.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tms.basic.pojo.domain.Driver;
import com.tms.basic.pojo.req.DriverQueryReq;
import com.tms.basic.pojo.vo.DriverVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 驾驶员信息Mapper接口
 *
 * @author TMS
 * @since 2024-01-01
 */
@Mapper
public interface DriverMapper extends BaseMapper<Driver> {

    /**
     * 分页查询驾驶员信息
     *
     * @param page 分页对象
     * @param req  查询条件
     * @return 驾驶员信息分页结果
     */
    IPage<DriverVO> selectDriverPage(Page<DriverVO> page, @Param("req") DriverQueryReq req);

    /**
     * 根据条件查询驾驶员信息列表
     *
     * @param req 查询条件
     * @return 驾驶员信息列表
     */
    List<DriverVO> selectDriverList(@Param("req") DriverQueryReq req);

    /**
     * 根据ID查询驾驶员详细信息（包含驾驶证信息）
     *
     * @param id 驾驶员ID
     * @return 驾驶员详细信息
     */
    DriverVO selectDriverById(@Param("id") Long id);

    /**
     * 根据手机号查询驾驶员信息
     *
     * @param phoneNumber 手机号
     * @return 驾驶员信息
     */
    DriverVO selectDriverByPhoneNumber(@Param("phoneNumber") String phoneNumber);

    /**
     * 根据身份证号查询驾驶员信息
     *
     * @param idCardNumber 身份证号
     * @return 驾驶员信息
     */
    DriverVO selectDriverByIdCardNumber(@Param("idCardNumber") String idCardNumber);

    /**
     * 查询驾照即将到期的驾驶员（30天内到期）
     *
     * @param days 提前天数
     * @return 驾照即将到期的驾驶员列表
     */
    List<DriverVO> selectLicenseExpiringDrivers(@Param("days") Integer days);

    /**
     * 根据状态统计驾驶员数量
     *
     * @param organizationId 机构ID
     * @return 驾驶员状态统计结果
     */
    List<java.util.Map<String, Object>> countDriverByStatus(@Param("organizationId") Long organizationId);

    /**
     * 查询空闲的驾驶员
     *
     * @param licenseType 驾照类型（可选）
     * @param organizationId 机构ID（可选）
     * @return 空闲驾驶员列表
     */
    List<DriverVO> selectAvailableDrivers(@Param("licenseType") String licenseType, 
                                         @Param("organizationId") Long organizationId);
} 